/*
=============================
名称：dark.form
=============================
属性：
	名称			类型		默认值		描述
	appendTo		jquery		null		jquery对象
	title			string		"title"		标题
	width			int			800			宽度
	items			array		[]			各个子项对象，参照dark.form.item对象
	method			string		"post"		表单提交方式
	url				string		""			远程加载表单数据页面(优先于data属性)
	data			object		{}			加载到页面的的数据对象，参照dark.form.data对象
事件
	名称			参数		描述
	onLoadSuccess	data		远程加载页面成功回调函数。data(object)为页面返回的json数据。
	onLoadError		null		远程加载页面失败回调函数。
	
--------------------------------------------------------------------------------------------------------------------------------------------------------	
--------------------------------------------------------------------------------------------------------------------------------------------------------	
	
=============================
名称：dark.form.item
=============================
公共属性：
	名称			类型		默认值		描述
	id				string		"null"		唯一标示
	label			string		"null"		行标签
	value			string		""			控件的值
	type			string		"textbox"	控件类型。具体值参照dark.form.item.type对象
	required		bool		false		是否必填
	validType		string		""			必填项验证规则
    width           int         auto        控件宽度
    height          int         auto        控件高度
    tip             string      ""          提示信息
hidden		隐藏框
	特有属性
	无
textbox		普通文本框
	特有属性
	无
editor		富文本框编辑器
	特有属性
	无
comboBox	单选下拉列表
	特有属性
	名称			类型		默认值		描述
	url				string		""			远程加载json数据（优先于data属性）
	parameters		object		{}			附加给url的参数
	data			array		[]			需要加载的数据
	editable		bool		false		是否允许编辑
	事件
	名称			参数		描述
	onSelect		row			选择事件，row(object)：2个属性，value值，text文本	
radio		单选框
	特有属性
	名称			类型		默认值		描述
	data			array		[]			需要加载的数据源,{text:"",id:""}的数组
checkbox	复选框
	特有属性
	名称			类型		默认值		描述
	data			array		[]			需要加载的数据源,{text:"",id:""}的数组
submit		提交按钮
	特有属性
	名称			类型		默认值		描述
	url				string		""			提交的地址,如果为空，则不会触发success,onLoadError事件
	事件
	名称			参数			描述
	onClick			isValid			单击事件，isValid(bool,json): 包含的所有控件是否通过验证和表单所有控件组成的值对象
	success			isValid, data	提交成功事件，isValid(bool,data):包含的所有控件是否通过验证,data(string)提交页面输出的字符串
	onLoadError		null			提交失败事件	
uploader	文件上传控件
	特有属性
	名称			        类型		默认值				                描述
	folder			        string		"UploadFiles"		                保存的文件夹
	scriptData		        object		{}					                附加参数
	buttonText		        string		"Select"			                按钮文字
	fileExt			        string 		"*.jpg|*.gif|*.png"	                允许上传类型
    file_types_description  string      "JPG Images; PNG Image; Gif Image"  对话框描述
	script			        stirng		""					                处理页面地址
    file_size_limit         string      "30M"                               运行上传文件大小
    file_widthheight        array       [500,500]                           上传前等比例处理的比率[weight,height]

	事件
	名称			参数				描述
	onComplete		fileObj, response	上传成功事件。fileObj(object):文件对象，response(string)处理页面输出的字符串
    onUploadStart   null                上传开始事件
    onError         null                上传失败事件

datebox		日期选择控件
	特有属性
	无
numberspinner	数字控件
	特有属性
	名称			类型		默认值		描述
	editable		bool		true		是否允许编辑
	min				int			-99999		最小值
	max				int			 99999		最大值
	
--------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------	

=============================
名称：dark.form.data
=============================
	{name:value}对象，用于覆盖dark.form.items设定的属性值。name对应dark.form.items.id。value如果为string类型，则对应dark.form.items.value的值，如果为{}对象，则直接重写dark.form.items对应的属性。如:{Title:"hello",Message:{value:"world",required:true}},表示重写Title的value值为hello,重写Message的value值为world,并且设置为required=true.

--------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------	

=============================
名称：dark.form.item.type
=============================
	名称			类型
	textbox			普通文本框
	editor			富文本框编辑器
	comboBox		单选下拉列表
	radio			单选框
	checkbox		复选框
	submit			提交按钮
	uploader		文件上传控件
	datebox			日期选择控件
	numberspinner	数字控件
	
--------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------	
*/
if (typeof (dark) == "undefined")
    window.dark = {};
$.extend(window.dark, {
    //title:标题，appendTo：需要处理的id，width：宽度，items:[]数据源，method：提交方式
    form: function (opt) {
        var options = {
            title: "title",
            appendTo: null,
            width: 800,
            items: [],
            method: "post",
            url: "",
            data: {},
            onLoadSuccess: $.noop,
            onLoadError: $.noop
        };
        var t = this;
        $.extend(options, opt);

        var genHtml = function () {
            //table
            var html = {
                form: "<div id=\"d-form\" style=\"width:{1}px\">{0}</div>",
                title: "<div id=\"d-form-title\">{0}</div>",
                ul: "<table>{0}</table>",
                li: { frame: "<tr style=\"{2}\">{0}{1}</tr>", label: "<td><label for=\"{0}\" class=\"d-label\">{1}:</label></td>", span: "<td class=\"d-form-span\"><span>{0}</span>{1}</td>" },
                hidden: "<input name=\"{0}\" id=\"{0}\" type=\"hidden\" value=\"{1}\"/>",
                textbox: "<input name=\"{0}\" id=\"{0}\" type=\"input\" value=\"{1}\"/>",
                editor: "<textarea name=\"{0}\" id=\"{0}\">{1}</textarea>",
                radio: "<input id=\"{0}\" name=\"{2}\" type=\"radio\" {3}/><label for=\"{0}\">{1}</label>",
                checkbox: "<input name=\"{0}\" id=\"{0}\" type=\"checkbox\" {2}/><label for=\"{0}\">{1}</label>",
                submit: "<td colspan=\"2\"><a id=\"{1}\" value=\"{0}\">{0}</a><td>",
                comboBox: "<input id=\"{0}\" name=\"{0}\" value=\"{1}\" />",
                uploader: "<input type=\"input\" name=\"{0}\" id=\"{0}\" value=\"{1}\" /><div id=\"uploadIcon_{0}\"></div><img id=\"preview_{0}\" width=\"38\" height=\"38\"/>",
                datebox: "<input name=\"{0}\" id=\"{0}\" type=\"input\" value=\"{1}\"/>",
                numberspinner: "<input name=\"{0}\" id=\"{0}\" type=\"input\" value=\"{1}\"/>",
                tip:"<span class=\"d-form-tip\">{0}</span>"
            };
            var lis = "";  //<li>html集合


            //处理items的属性值
            $.each(options.items, function (i, e) {
                var _commonDefaultProperty = { id: "null", label: "null", value: "", type: "textbox", required: false, validType: "",tip:"" }; //公共默认属性
                //先看看data有没有parameters
                var _formData = {};
                if (options.data[e.id] != undefined) {
                    if (typeof (options.data[e.id]) == "object") {
                        _formData = options.data[e.id];
                    } else {
                        _formData = { value: options.data[e.id] };
                    }
                }
                //属性优先级，从高到低   form.data > form.items > default
                options.items[i] = $.extend(_commonDefaultProperty, e, _formData);
            });

            //生成html
            $.each(options.items, function (i, item) {
                switch (item.type) {
                    case "textbox":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.textbox.format(item.id, item.value),item.tip), "")
                        break;
                    case "hidden":
                        lis += html.hidden.format(item.id, item.value);
                        break;
                    case "editor":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.editor.format(item.id, item.value), html.tip.format(item.tip)), "")
                        break;
                    case "comboBox":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.comboBox.format(item.id, item.value), html.tip.format(item.tip)), "")
                        break;
                    case "radio": //data:数据源
                        item = $.extend({ data: [] }, item);
                        var radioItems = "";
                        $.each(item.data, function (j, d) {
                            var checked = "";
                            if (d.id == item.value)
                            { checked = "checked"; }
                            radioItems += html.radio.format(d.id, d.text, item.id, checked);
                        });
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(radioItems, html.tip.format(item.tip)), "")
                        break;
                    case "checkbox": //data:数据源{}
                        item = $.extend({ data: [] }, item);
                        var checkboxItems = "";
                        var values = item.value.split(",");
                        $.each(item.data, function (j, d) {
                            var checked = ""
                            if (d.checked || dark.isExistInArray(values, d.id))
                            { checked = "checked=\"true\"" }
                            checkboxItems += html.checkbox.format(d.id, d.text, checked);
                        });
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(checkboxItems, html.tip.format(item.tip)), "")
                        break;
                    case "submit":  //onClick:单击事件，success:提交成功事件，onLoadError:加载数据失败事件
                        item = $.extend({ onClick: function () { }, success: function () { }, onLoadError: function () { }, url: "" }, item);
                        lis += html.li.frame.format(html.submit.format(item.label, item.id), "", "");
                        $("#" + item.id).live("click", function () {
                            var isValid = options.appendTo.form("validate");
                            if (isValid == true) {
                                if (item.url.length == 0) {
                                    var formData = getData();
                                    item.onClick(isValid, formData);
                                } else {
                                    options.appendTo.form("submit", {
                                        url: item.url,
                                        onSubmit: function () {
                                            var formData = getData();
                                            item.onClick(isValid, formData);
                                        },
                                        success: function (data) {
                                            item.success(isValid, data);
                                        },
                                        onLoadError: function () {
                                            item.onLoadError();
                                        }
                                    });
                                }
                            }
                        });
                        break;
                    case "uploader":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.uploader.format(item.id, item.value), html.tip.format(item.tip)), "")
                        break;
                    case "datebox":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.datebox.format(item.id, item.value), html.tip.format(item.tip)), "")
                        break;
                    case "numberspinner":
                        lis += html.li.frame.format(html.li.label.format(item.id, item.label), html.li.span.format(html.numberspinner.format(item.id, item.value), html.tip.format(item.tip)), "")
                        break;
                }
            });
            var formcontent = html.title.format(options.title) + html.ul.format(lis);
            var _form = html.form.format(formcontent, options.width);


            options.appendTo.attr("method", options.method).append(_form);   //把处理好的html加载到指定div


            //生成UI
            $.each(options.items, function (i, item) {
                switch (item.type) {
                    case "textbox":
                        $("#" + item.id).css({ width: item.width, height: item.height });
                        $("#" + item.id).validatebox({
                            required: item.required,
                            validType: item.validType
                        });
                        break;
                    case "comboBox": //url:远程加载url，onSelect:选择事件,editable:是否允许编辑,data:加载json数据,parameters:附加参数键值对
                        item = $.extend({ url: "", parameters: {}, onSelect: function () { }, data: [], editable: false }, item);
                        $("#" + item.id).combobox({
                            data: item.data,
                            url: item.url + "?" + $.param(item.parameters),
                            valueField: 'value',
                            textField: 'text',
                            editable: item.editable,
                            required: item.required,
                            onSelect: function (r) { item.onSelect(r) }
                        });
                        //set value
                        if (item.value.length == 0) {
                            $("#" + item.id).combobox("clear");
                        } else {
                            $("#" + item.id).combobox("setValue", item.value);
                        }
                        break;
                    case "editor":
                        var oFCKeditor = new FCKeditor(item.id);
                        oFCKeditor.Width = item.width;
                        oFCKeditor.Height = item.height;
                        oFCKeditor.ReplaceTextarea();
                        break;
                    case "submit":
                        $("#" + item.id).linkbutton({
                            plain: false,
                            iconCls: item.iconCls
                        });
                        break;
                    case "uploader": //folder:保存的路径，scriptData:附加参数，buttonText：按钮文字，fileExt：允许上传类型，script：处理页面地址，onComplete:完成事件
                        $("#" + item.id).css({width:item.width,height:item.height});
                        item = $.extend({ folder: "UploadFiles", scriptData: {}, buttonText: "Select", fileExt: "*.jpg;*.png;*.gif", script: "", onComplete: function () { } }, item);
                        dark.upload({
                            id: "uploadIcon_" + item.id,
                            script: item.script,
                            folder: item.folder,
                            scriptData: item.scriptData,
                            fileExt: item.fileExt,
                            buttonText: item.buttonText,
                            onComplete: function (file, serverData) {
                                $("#" + item.id).val(serverData);
                                $("#preview_" + item.id).attr("src", serverData);
                                item.onComplete(file, serverData);
                                alert("success");
                            },
                            onUploadStart: function () { alert("start"); },
                            onError: function () { alert("error"); }
                        });
                        break;
                    case "datebox":
                        $("#" + item.id).datebox({
                            required: item.required
                        });
                        break;
                    case "radio":
                        break;
                    case "checkbox":
                        break;
                    case "numberspinner":  //editable:是否允许编辑，min:最小值，max：最大值
                        item = $.extend({ editable: true, min: -99999, max: 99999 }, item);
                        $("#" + item.id).numberspinner({
                            required: item.required,
                            editable: item.editable,
                            min: item.min,
                            max: item.max
                        });
                        break;
                }
            });
        }

        if (options.url.length > 0) {
            $.messager.progress({ text: "", title: "正在加载，请稍后.." });
            $.getJSON(options.url, function (data) {
                options.data = data;
                genHtml();
                $.messager.progress("close");
                options.onLoadSuccess(data);
            }
            );
        } else {
            genHtml();
        }

        var getData = function () {
            var data = {};
            $.each(options.items, function (i, item) {
                switch (item.type) {
                    case "hidden":
                        data[item.id] = $("input[id=" + item.id + "]").val();
                        break;
                    case "textbox":
                        data[item.id] = $("input[id=" + item.id + "]").val();
                        break;
                    case "editor":
                        data[item.id] = FCKeditorAPI.GetInstance(item.id).GetXHTML(true)
                        break;
                    case "comboBox":
                        data[item.id] = $("input[name=" + item.id + "]").val();
                        break;
                    case "radio":
                        data[item.id] = $(":radio[name=" + item.id + "]:checked").attr("id")
                        break;
                    case "checkbox":
                        $.each(item.data, function (j, d) {
                            //data[d.id] = $("input[name=" + d.id + "]").attr("checked") != "undefined";                            
                            data[d.id] = $(":checkbox:checked[id=" + d.id + "]").length > 0;
                        });
                        break;
                    case "submit":
                        break;
                    case "uploader":
                        data[item.id] = $("input[name=" + item.id + "]").val();
                        break;
                    case "datebox":
                        data[item.id] = $("input[name=" + item.id + "]").val();
                        break;
                    case "numberspinner":
                        data[item.id] = $("input[name=" + item.id + "]").val();
                        break;
                }
            });
            return data;
        };
    },
    upload: function (options) {
        if (typeof (options) == "string") {
            options = { button_placeholder_id: options };
        }

        var _options = $.extend({
            script: "handlers/saveImage.ashx",
            folder: "../UploadFiles",
            file_size_limit: "30 MB",
            fileExt: "*.jpg;*.png;*.gif",
            file_types_description: "JPG Images; PNG Image; Gif Image",
            file_widthheight: [500, 500],
            buttonText: "Upload Images",
            id: "",
            scriptData: {}, //附加参数
            onUploadStart: $.noop,
            onError: $.noop,
            onComplete: $.noop
        }, options);

        $.extend(_options.scriptData, { folder: _options.folder });
        return new SWFUpload({
            upload_url: _options.script,
            post_params: _options.scriptData,
            // File Upload Settings
            file_size_limit: _options.file_size_limit,
            file_types: _options.fileExt,
            file_types_description: _options.file_types_description,
            file_upload_limit: 100,
            file_widthheight: _options.file_widthheight,  //缩放图片[w,h]

            swfupload_preload_handler: function () {
                if (!this.support.loading) {
                    alert("You need the Flash Player to use SWFUpload.");
                    return false;
                } else if (!this.support.imageResize) {
                    alert("You need Flash Player 10 to upload resized images.");
                    return false;
                }
            },
            swfupload_load_failed_handler: function () {
                alert("Something went wrong while loading SWFUpload. If this were a real application we'd clean up and then give you an alternative");
            },
            upload_start_handler: _options.onUploadStart,
            file_dialog_complete_handler: function (numFilesSelected, numFilesQueued) {
                if (numFilesQueued > 0) {
                    var t = this;
                    var i = 0;
                    for (i = 0; i < numFilesQueued; i++) {
                        t.startResizedUpload(t.getFile(i).ID, t.settings.file_widthheight[0], t.settings.file_widthheight[1], SWFUpload.RESIZE_ENCODING.JPEG, 95);
                    }
                }
            }, //选择对话框关闭事件
            upload_error_handler: _options.onError, //上传失败事件
            upload_success_handler: _options.onComplete, //单个文件上传成功事件

            button_placeholder_id: _options.id,
            button_width: 100,
            button_height: 25,
            button_action: SWFUpload.BUTTON_ACTION.SELECT_FILE,  //单图片上传
            button_text: _options.buttonText,
            button_text_left_padding: 2,
            button_text_top_padding: 2,


            button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
            button_cursor: SWFUpload.CURSOR.HAND,

            // Flash Settings
            flash_url: "js/swfuploader/swfupload.swf",
            flash9_url: "js/swfuploader/swfupload_fp9.swf"


        });
    }
});